/*!
 * \file ParserXTP.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief XTP行情解析器头文件
 * 
 * \details 该文件定义了ParserXTP类，是WonderTrader系统中用于接入XTP行情服务器的核心组件：
 *          - 实现IParserApi接口，提供统一的行情解析服务
 *          - 继承XTP::API::QuoteSpi，处理XTP行情API回调事件
 *          - 支持实时行情数据接收和转换
 *          - 支持合约订阅和退订管理
 *          - 支持连接状态管理和心跳监控
 *          - 专门针对XTP（中泰证券交易平台）的行情接入
 *          - 支持上海和深圳交易所的分别订阅管理
 *          - 提供完整的错误处理和日志记录功能
 *          - 支持多种XTP API版本的动态库加载
 * 
 * \note XTP是中泰证券开发的证券交易系统平台，主要用于股票行情
 */
#pragma once
#include "../Includes/IParserApi.h"
#include "../Share/DLLHelper.hpp"
#include "../API/XTP2.2.32.2/xtp_quote_api.h"
#include <map>

NS_WTP_BEGIN
class WTSTickData;
NS_WTP_END

USING_NS_WTP;

/*!
 * \class ParserXTP
 * \brief XTP行情解析器类
 * 
 * \details ParserXTP是WonderTrader系统中用于接入XTP（中泰证券交易平台）行情服务器的核心组件，主要功能包括：
 *          - XTP行情连接管理：负责与XTP行情服务器的连接、登录、断线重连等
 *          - 数据订阅管理：支持股票合约的批量订阅和退订，按交易所分别管理
 *          - 行情数据转换：将XTP原始行情数据转换为WonderTrader标准格式
 *          - 交易所处理：支持上海证券交易所和深圳证券交易所的分别处理
 *          - 协议支持：支持TCP和UDP等不同传输协议
 *          - 错误处理：完善的错误检查和异常处理机制
 *          - 状态监控：连接状态监控、心跳检测、登录状态管理
 *          - 动态库支持：支持不同版本的XTP动态库加载
 *          - 客户端管理：支持客户端ID和缓冲区大小等参数配置
 * 
 * \note 该类专门用于处理XTP系统的股票行情数据，支持沪深两市
 * \warning 使用前必须正确配置XTP相关参数：host、port、user、pass、clientid等
 * \see IParserApi XTP::API::QuoteSpi
 */
class ParserXTP :	public IParserApi, public XTP::API::QuoteSpi
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * 初始化ParserXTP实例，设置默认参数
	 */
	ParserXTP();
	
	/*!
	 * \brief 析构函数
	 * 
	 * 清理资源，确保正确断开连接
	 */
	virtual ~ParserXTP();

public:
	/*!
	 * \enum LoginStatus
	 * \brief 登录状态枚举
	 * 
	 * 定义XTP连接的各种登录状态
	 */
	enum LoginStatus
	{
		LS_NOTLOGIN,	///< 未登录状态
		LS_LOGINING,	///< 正在登录状态
		LS_LOGINED		///< 已登录状态
	};

// IParserApi 接口实现
public:
	/*!
	 * \brief 初始化行情解析器
	 * \param config 配置参数对象
	 * \return 是否初始化成功
	 * 
	 * \details 从配置对象中读取以下参数：
	 *          - host: XTP行情服务器主机地址
	 *          - port: XTP行情服务器端口号
	 *          - user: 用户名
	 *          - pass: 密码
	 *          - protocol: 传输协议类型（TCP/UDP）
	 *          - clientid: 客户端ID
	 *          - hbinterval: 心跳间隔
	 *          - buffsize: 缓冲区大小
	 *          - flowdir: 流文件目录
	 *          - xtpmodule: XTP动态库模块名（默认：xtpquoteapi）
	 */
	virtual bool init(WTSVariant* config) override;

	/*!
	 * \brief 释放资源
	 * 
	 * 断开连接并清理所有资源
	 */
	virtual void release() override;

	/*!
	 * \brief 建立连接
	 * \return 是否连接成功
	 * 
	 * 启动XTP行情API，建立与服务器的连接
	 */
	virtual bool connect() override;

	/*!
	 * \brief 断开连接
	 * \return 是否断开成功
	 * 
	 * 断开与XTP行情服务器的连接，清理API资源
	 */
	virtual bool disconnect() override;

	/*!
	 * \brief 检查连接状态
	 * \return 是否已连接
	 * 
	 * 返回当前与XTP行情服务器的连接状态
	 */
	virtual bool isConnected() override;

	/*!
	 * \brief 订阅行情数据
	 * \param vecSymbols 要订阅的股票代码集合
	 * 
	 * 向XTP服务器发送行情订阅请求，支持批量订阅，自动按交易所分类
	 */
	virtual void subscribe(const CodeSet &vecSymbols) override;
	
	/*!
	 * \brief 退订行情数据
	 * \param vecSymbols 要退订的股票代码集合
	 * 
	 * 向XTP服务器发送行情退订请求
	 */
	virtual void unsubscribe(const CodeSet &vecSymbols) override;

	/*!
	 * \brief 注册行情回调接口
	 * \param listener 行情数据回调接口指针
	 * 
	 * 注册行情数据处理回调接口，用于接收处理后的股票行情数据
	 */
	virtual void registerSpi(IParserSpi* listener) override;


// XTP::API::QuoteSpi 接口实现
public:
	/*!
	 * \brief 连接断开回调
	 * \param reason 断开原因代码
	 * 
	 * \details 当客户端与交易后台通信连接断开时，该方法被调用。当发生这个情况后，API会自动重连，客户端可不做处理。
	 *          断开原因包括：
	 *          - 0x1001 网络读失败
	 *          - 0x1002 网络写失败  
	 *          - 0x2001 接收心跳超时
	 *          - 0x2002 发送心跳失败
	 *          - 0x2003 收到错误报文
	 */
	virtual void OnDisconnected(int reason) override;

	/*!
	 * \brief 错误应答回调
	 * \param error_info 错误信息结构体指针
	 * 
	 * 处理XTP API返回的错误信息
	 */
	virtual void OnError(XTPRI *error_info) override;

	/*!
	 * \brief 订阅行情应答回调
	 * \param ticker 详细的合约订阅情况
	 * \param error_info 订阅合约发生错误时的错误信息，当error_info为空，或者error_info.error_id为0时，表明没有错误
	 * \param is_last 是否此次订阅的最后一个应答，当为最后一个的时候为true，如果为false，表示还有其他后续消息响应
	 * 
	 * 处理股票行情订阅响应
	 */
	virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) override;
	
	/*!
	 * \brief 退订行情应答回调
	 * \param ticker 详细的合约取消订阅情况
	 * \param error_info 取消订阅合约时发生错误时返回的错误信息，当error_info为空，或者error_info.error_id为0时，表明没有错误
	 * \param is_last 是否此次取消订阅的最后一个应答，当为最后一个的时候为true，如果为false，表示还有其他后续消息响应
	 * 
	 * 处理股票行情退订响应
	 */
	virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) override;
	
	/*!
	 * \brief 深度行情通知回调
	 * \param market_data 行情数据
	 * \param bid1_qty 买一队列数据
	 * \param bid1_count 买一队列的有效委托笔数
	 * \param max_bid1_count 买一队列总委托笔数
	 * \param ask1_qty 卖一队列数据
	 * \param ask1_count 卖一队列的有效委托笔数
	 * \param max_ask1_count 卖一队列总委托笔数
	 * 
	 * \details 接收XTP推送的实时股票行情数据，进行以下处理：
	 *          - 股票合约信息验证和查找
	 *          - 时间处理和数据校验
	 *          - 数据格式转换（XTP -> WonderTrader标准格式）
	 *          - 股票价格有效性检查
	 *          - 成交量和成交额处理
	 *          - 买卖盘口数据处理（支持队列数据）
	 *          - 涨跌停价格和涨跌幅计算
	 *          - 沪深两市的不同处理逻辑
	 * 
	 * \note 这是最核心的股票行情数据处理方法，支持Level2数据
	 */
	virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) override;

private:
	/*!
	 * \brief 执行登录操作
	 * 
	 * 向XTP服务器发起登录请求
	 */
	void DoLogin();
	
	/*!
	 * \brief 执行行情数据订阅
	 * 
	 * 向XTP服务器发送批量股票行情订阅请求
	 */
	void DoSubscribeMD();
	
	/*!
	 * \brief 检查响应信息是否包含错误
	 * \param error_info 错误信息结构体指针
	 * \return 是否包含错误
	 * 
	 * 检查XTP API返回的响应信息中是否包含错误
	 */
	bool IsErrorRspInfo(XTPRI *error_info);


private:
	uint32_t			m_uTradingDate;		///< 当前交易日期
	LoginStatus			m_loginState;		///< 登录状态
	XTP::API::QuoteApi*	m_pUserAPI;			///< XTP行情API指针

	std::string			m_strHost;			///< 服务器主机地址
	int32_t				m_iPort;			///< 服务器端口号
	uint32_t			m_uClientID;		///< 客户端ID
	std::string			m_strUser;			///< 用户名
	std::string			m_strPass;			///< 密码
	std::string			m_strFlowDir;		///< 流文件目录路径

	XTP_PROTOCOL_TYPE	m_iProtocol;		///< 传输协议类型（TCP/UDP）
	uint32_t			m_uHBInterval;		///< 心跳间隔时间
	uint32_t			m_uBuffSize;		///< 缓冲区大小

	CodeSet				m_fitSHSubs;		///< 上海交易所待订阅股票代码集合
	CodeSet				m_fitSZSubs;		///< 深圳交易所待订阅股票代码集合

	int					m_iRequestID;		///< 请求ID计数器

	IParserSpi*			m_sink;				///< 行情数据回调接口指针
	IBaseDataMgr*		m_pBaseDataMgr;		///< 基础数据管理器指针

	DllHandle			m_hInst;			///< XTP动态库句柄
	typedef XTP::API::QuoteApi* (*XTPCreater)(uint8_t, const char *, XTP_LOG_LEVEL log_level);	///< XTP API创建函数类型定义
	XTPCreater			m_funcCreator;		///< XTP API创建函数指针
};

